#include <my_header.h>
/*Usage: 02_select_w */
int main(int argc, char *argv[]){
    int pipe_w = open("1.pipe",O_WRONLY); //对这边来说1.pipe是写管道
    int pipe_r = open("2.pipe", O_RDONLY);//这边来说2.pipe是读管

    fd_set set;//定义select结构体对象

    while(1){//循环进行 读入输出 两个操作

        FD_ZERO(&set);           //初始化select结构体
        FD_SET(STDIN_FILENO, &set);//传入要监听的文件描述 stdin
        FD_SET(pipe_r, &set);//传入要监听的文件描述读取内容的管道

        //开启读监听，监听的位的范围就是最大监听位+1
        select(pipe_r + 1, &set, NULL, NULL, NULL);

        //使用select来监听是读取数据还是写数据
        if(FD_ISSET(STDIN_FILENO, &set)){
            //说明此时是键盘输入内容传输到读取对象
            char buf[1024] = { 0 };
           ssize_t ret =  read(STDIN_FILENO, buf, sizeof(buf));
           ERROR_CHECK(ret , -1, "read error");
           write(pipe_w, buf, sizeof(buf));

        }else if(FD_ISSET(pipe_r, &set)){
            //接收输入对象输入管道的内容
            char buf[1024] = { 0 };
            ssize_t ret = read(pipe_r, buf, sizeof(buf));
            ERROR_CHECK(ret, -1, "read error");
            //如果读取到的内容是1代表着退出程序
            if(strlen(buf) == 2 && buf[0] == '1'){
                break;
            }
            if(ret == 0){
                //到这里说明输入程序已经关闭了
                //可以读取管道数据，但是管道里面没有数据了
                //那就直接关闭程序
                break;
            }
            //打印读取到的管道中的内容
            printf("buf = %s\n", buf);
        }
    }

    close(pipe_w);
    close(pipe_r);
    return 0;
}


